package com.xu.cloud.common.util;

import com.xu.cloud.common.exception.ErrorCodeEnum;
import com.xu.cloud.common.exception.XuCloudException;
import org.springframework.lang.Nullable;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;

import java.util.Objects;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 参数断言工具类
 *
 * @author xuguan
 * @see XuCloudException
 * @since 2024/3/6
 */
public final class AssertUtil {
    private static final XuCloudException defaultException = new XuCloudException(ErrorCodeEnum.ERR_ILLEGAL_PARAM.getCode(), ErrorCodeEnum.ERR_ILLEGAL_PARAM.getMessage());

    public static void assertNotNull(Object value) {
        assertNotNull(value, null);
    }

    /**
     * 校验不为null
     *
     * @param value 参数值
     * @param e     异常
     */
    public static void assertNotNull(Object value, @Nullable XuCloudException e) {
        assertTrue(Objects.nonNull(value), e);
    }

    public static void assertNotEmpty(Object value) {
        assertNotEmpty(value, null);
    }

    /**
     * 校验不为null并且长度/容量不为0
     *
     * @param value 参数值
     * @param e     异常
     */
    public static void assertNotEmpty(Object value, @Nullable XuCloudException e) {
        assertTrue(!ObjectUtils.isEmpty(value), e);
    }

    public static void assertHasText(String value) {
        assertHasText(value, null);
    }

    /**
     * 校验字符串含有不为空格的字符
     *
     * @param value 参数值
     * @param e     异常
     */
    public static void assertHasText(String value, @Nullable XuCloudException e) {
        assertTrue(StringUtils.hasText(value), e);
    }

    public static void assertEquals(@Nullable Object o1, @Nullable Object o2) {
        assertEquals(o1, o2, null);
    }

    /**
     * 校验对象是否相等
     *
     * @param o1 参数值1
     * @param o2 参数值2
     * @param e  异常
     */
    public static void assertEquals(@Nullable Object o1, @Nullable Object o2, @Nullable XuCloudException e) {
        assertTrue(ObjectUtils.nullSafeEquals(o1, o2), e);
    }

    public static void assertRegex(String value, String regex) {
        assertRegex(value, regex, null);
    }

    /**
     * 校验正则表达式
     *
     * @param value 参数值
     * @param regex 正则表达式
     * @param e     异常
     */
    public static void assertRegex(String value, String regex, @Nullable XuCloudException e) {
        final Pattern pattern = Pattern.compile(regex);
        final Matcher matcher = pattern.matcher(value);
        assertTrue(matcher.matches(), e);
    }

    public static void assertTrue(boolean expression) {
        assertTrue(expression, null);
    }

    /**
     * 校验布尔表达式, 不满足条件抛出异常
     *
     * @param expression 布尔表达式
     * @param e          异常
     */
    public static void assertTrue(boolean expression, @Nullable XuCloudException e) {
        if (!expression) {
            throw Objects.isNull(e) ? defaultException : e;
        }
    }
}
